package com.example.testapplication;

import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

/**
 * 1. 网络上请求数据：申请网络权限 读写存储权限
 * 2.布局
 * 3.下载之前我们要做什么
 * 4.下载中我们要做什么
 * 5.下载后我们要做什么？
 *
 *
 * */

public class AsncTaskActivity extends AppCompatActivity {
    private static final String TAG = "AsncTaskActivity";
    private ProgressBar progressBar;
    private Button mDownloadButton;
    private TextView mTextView;
    private int INIT_PROGRESS;
    public static final String APK_URL = "http://download.sj.qq.com/upload/connAssitantDownload/upload/MobileAssistant_1.apk";
    String mFilePath;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_imocasnc);
        // java 泛型基础（需加强）
        // 初始化视图
        initView();
        // 设置点击监听
        setListener();
        // 初始化UI数据
        setData();
    }

    private void setData() {
        INIT_PROGRESS = 0;
        progressBar.setProgress(INIT_PROGRESS);
        mDownloadButton.setText(R.string.click_download); // 快捷键 ctrl + enter
        mTextView.setText(R.string.download_text);
    }

    private void setListener() {
        mDownloadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // TODO: 2021/12/20 下载任务
                DownloadAsncTask asncTask = new DownloadAsncTask();
                //asncTask.execute("xxxx","xxxx","xxxxx");
                asncTask.execute(APK_URL);
            }
        });
    }

    // 初始化
    private void initView() {
        // 快捷键 ctrl+alt + f
        progressBar = (ProgressBar) findViewById(R.id.progressBar);
        mDownloadButton = (Button) findViewById(R.id.load_button2);
        mTextView = (TextView) findViewById(R.id.load_txt);
    }
    /**
     * String 入参
     * Integer 进度
     * Boolean 返回值
     *
     * */

    public class DownloadAsncTask extends AsyncTask<String,Integer,Boolean>{
        /**
         *  在异步任务之前，在主线程中
         * */
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            // 可操作UI
            mDownloadButton.setText("下载中....");
            mTextView.setText("下载中");
            progressBar.setProgress(0);
        }

        // 在另外一个线程中处理事件
        @Override
        // String... params 表示可变参数
        protected Boolean doInBackground(String... params) {
            if(params != null && params.length > 0){
                String apkUrl = params[0];
                try {
                    // 构造URL
                    URL url = new URL(apkUrl);
                    // 构造连接，并打开
                    URLConnection urlConnection = url.openConnection();
                    InputStream inputStream = urlConnection.getInputStream();
                    // 获取下载内容的总长度
                    int contentLength = urlConnection.getContentLength();
                    // 下载地址准备
                    mFilePath = Environment.getExternalStorageDirectory() + File.separator+"imooc.apk";
                    // 对下载地址进行处理
                    File apkFile = new File(mFilePath);
                    if(apkFile.exists()){
                        boolean result = apkFile.delete();
                        if(!result){
                            return false;
                        }
                    }
                    // 已下载的大小
                    int downloadSize = 0;
                    // byte 数组
                    byte[] bytes = new byte[1024];
                    int length;
                    // 创建一个输入管道
                    OutputStream outputStream = new FileOutputStream(mFilePath);
                    while ((length = inputStream.read(bytes))!= -1){
                        outputStream.write(bytes,0,length);
                        downloadSize += length;
                        //  发送进度
                        publishProgress(downloadSize * 100/contentLength);
                    }
                    inputStream.close();
                    outputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    return  false;
                }
            }else{
                return false;
            }

            return true;
        }

        @Override
        protected void onPostExecute(Boolean result) {
            super.onPostExecute(result);
            // 也是在主线程中，执行结果，处理
            mDownloadButton.setText(result?"下载完成":"下载失败");
            mTextView.setText(result?"下载完成":"下载失败");
        }

        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            // 收到进度，然后处理: 也是在UI线程中
            // 收到进度，然后处理： 也是在UI线程中。
            if (values != null && values.length > 0) {
                progressBar.setProgress(values[0]);
            }

        }


    }
}
